сдается мне, что это не возможно без костылей, или же эту фичу юзали все картоделы :\
можно приподнимать декорации с помощью cntrl или shit + page down/page up, но это сугубо визуально, физически они будут все равно размещены внизу
на ум приходит только установка необходимой высоты всем проходящим по верхней стороне юнитам, но там будет другой геморрой (к примеру, если по мосту бежит несколько пехотинцев, враждебных друг другу, пехотинцы на верхней стороне не смогут быть атакованы, так как будут считаться "летающими")
Вот. Есть текст про описание движения как я понял (вот в чем разница между конным и пешим пока тоже не понял, интересует вот, что дает конный)
Эти паффинги, и типы движения взаимосвязаны. У некоторых есть баги, которыми можно воспользоваться. Например, чтобы летающие юниты игнорили ландшафт и летели прямо (вот на клифах может быть криво). На форуме дофига такого. Также можно сделать нелетающих летающими, дать сфинкс или превратиться в ворона (тоже баг) Ну и так далее
Viktor19:
кук пытается тебе втолковать, что неизвестный тип атаки - это технический тип урона, он используется для реализации стандартных спеллов и детектов дебаффа
Обычному юниту такой урон не поставить, как и тип защиты
8gabriel8, ты не понял его просто 8gabriel8, у способности канал
есть параметр id спелов
в нем ты можешь выставить ид канала на пример будто воин применяет не канал а молот бурь
сейчас сделаю скрин
вот
то что в той строке написано пишешь в функцию как строку "channel" ну или другое ид если менял Sergey105, кд спела узнать вроде нельзя без мемхака , но можно сделать триггер на каст спела
8gabriel8, ты не понял его просто 8gabriel8, у способности канал
есть параметр id спелов
в нем ты можешь выставить ид канала на пример будто воин применяет не канал а молот бурь
сейчас сделаю скрин
вот
то что в той строке написано пишешь в функцию как строку "channel" ну или другое ид если менял Sergey105, кд спела узнать вроде нельзя без мемхака , но можно сделать триггер на каст спела
Исправляется путем вставки иной точки вместо Point1, к примеру на TempPoint, в триггере, что вызывается интервалом.
Вот исправленный вариант твоей ужасосистемы... и как писал тут дадька nvc123:
вот только эта система генерирует точки кучами
На что ты должен обратить внимание в первую очередь!
И забыл написать, что так же последняя пуля тоже не учитывается. Лечится прямыми руками и внимательным чтением ресурсов данного сайта. Ибо тем по этому поводу тут полно...
Создаёт стену из магического льда, которая отталкивает противников от себя.
function IsUnitDeadBX takes unit u returns boolean
return GetUnitTypeId(u) == 0 or IsUnitType(u, UNIT_TYPE_DEAD)
endfunction
function IsTarget takes unit u,unit d returns boolean
return not IsUnitType(u,UNIT_TYPE_ANCIENT) and not IsUnitDeadBX(u) and not IsUnitType(u, UNIT_TYPE_STRUCTURE) and not IsUnitType(u, UNIT_TYPE_MAGIC_IMMUNE) and (IsUnitEnemy(u, GetOwningPlayer(d)) or GetOwningPlayer(u) == Player(15))
endfunction
function SQ takes real xa, real ya, real xb, real yb returns real
return SquareRoot((xa-xb)*(xa-xb)+(ya-yb)*(ya-yb))
endfunction
function SafeX takes real pxx returns real
local real lfr=GetRectMinX(bj_mapInitialPlayableArea)+50
if(pxx<lfr)then
return lfr
endif
set lfr=GetRectMaxX(bj_mapInitialPlayableArea)-50
if(pxx>lfr)then
return lfr
endif
return pxx
endfunction
function SafeY takes real pyy returns real
local real lfr=GetRectMinY(bj_mapInitialPlayableArea)+50
if(pyy<lfr)then
return lfr
endif
set lfr=GetRectMaxY(bj_mapInitialPlayableArea)-50
if(pyy>lfr)then
return lfr
endif
return pyy
endfunction
function UBU takes unit u, unit d, unit c , real w returns boolean
local real x = GetUnitX(u)
local real y = GetUnitY(u)
local real r1 = 57.295827*Atan2(y-GetUnitY(d),x-GetUnitX(d))
local real r2 = 57.295827*Atan2(y-GetUnitY(c),x-GetUnitX(c))
set r2 = r2 -180
if r1 < 0.00 then
set r1 = r1 + 360
endif
if r2 < 0.00 then
set r2 = r2 + 360
endif
if r1 - r2 <= w and r1 - r2 >= -(w) then
return true
else
return false
endif
endfunction
function IceWallCon takes nothing returns boolean
return GetSpellAbilityId() == 'A0KP'
endfunction
function IceWallCreate takes nothing returns nothing
local timer t = GetExpiredTimer()
local integer id = GetHandleId(t)
local unit c = LoadUnitHandle(udg_AssassinHash,id,0)
local real r = LoadReal(udg_AssassinHash,id,3)
local integer i = LoadInteger(udg_AssassinHash,id,4)
local integer j = LoadInteger(udg_AssassinHash,id,5)
local real x = LoadReal(udg_AssassinHash,id,StringHash("X"))
local real y = LoadReal(udg_AssassinHash,id,StringHash("Y"))
local real a = 0.
local real b = 0.
local boolean e = LoadBoolean(udg_AssassinHash,id,6)
local boolean f = LoadBoolean(udg_AssassinHash,id,7)
local boolean k = LoadBoolean(udg_AssassinHash,id,8)
local integer n = LoadInteger(udg_AssassinHash,id,25)
local real X2 = LoadReal(udg_AssassinHash,id,StringHash("X2"))
local real Y2 = LoadReal(udg_AssassinHash,id,StringHash("Y2"))
local real X3 = LoadReal(udg_AssassinHash,id,StringHash("X3"))
local real Y3 = LoadReal(udg_AssassinHash,id,StringHash("Y3"))
local integer h = 0
local group g = LoadGroupHandle(udg_AssassinHash,id,2)
local unit u
local unit d
local unit d1
if e == false then
set i = i+1
set j = j+1
if i < 7 then
set a = SafeX(x+(80.*i)*Cos(r))
set b = SafeY(y+(80.*i)*Sin(r))
set d = CreateUnit(GetOwningPlayer(c),'e00V',a,b,0)
call UnitAddAbility(d,'Arav')
call UnitRemoveAbility(d,'Arav')
call SetUnitFlyHeight(d,150,0)
call DestroyEffect(AddSpecialEffect("FrozenOrbBall.mdx",a,b))
call DestroyEffect(AddSpecialEffect("Abilities\\Weapons\\SpiritOfVengeanceMissile\\SpiritOfVengeanceMissile.mdl",a,b))
call SaveUnitHandle(udg_AssassinHash,id,StringHash("IWU1"+I2S(i)),d)
set a = SafeX(x-(80.*j)*Cos(r))
set b = SafeY(y-(80.*j)*Sin(r))
set d = CreateUnit(GetOwningPlayer(c),'e00V',a,b,0)
call UnitAddAbility(d,'Arav')
call UnitRemoveAbility(d,'Arav')
call SetUnitFlyHeight(d,150,0)
call DestroyEffect(AddSpecialEffect("FrozenOrbBall.mdx",a,b))
call DestroyEffect(AddSpecialEffect("Abilities\\Weapons\\SpiritOfVengeanceMissile\\SpiritOfVengeanceMissile.mdl",a,b))
call SaveUnitHandle(udg_AssassinHash,id,StringHash("IWU2"+I2S(j)),d)
call SaveInteger(udg_AssassinHash,id,4,i)
call SaveInteger(udg_AssassinHash,id,5,j)
else
call SaveBoolean(udg_AssassinHash,id,6,true)
endif
else
if f == false then
call SaveInteger(udg_AssassinHash,id,4,0)
call SaveReal(udg_AssassinHash,id,3,r-1.566)
call TimerStart(t,.025,true,function IceWallCreate)
call SaveBoolean(udg_AssassinHash,id,7,true)
else
set i = i+1
if i < 201 then
call SaveInteger(udg_AssassinHash,id,4,i)
set d = LoadUnitHandle(udg_AssassinHash,id,StringHash("IWU16"))
set d1 = LoadUnitHandle(udg_AssassinHash,id,StringHash("IWU26"))
call GroupClear(udg_G)
call GroupEnumUnitsInRange(udg_G,x,y,1040,null)
loop
set u = FirstOfGroup(udg_G)
if IsTarget(u,c) and UBU(u,d,d1,20.) and IsUnitInGroup(u,g) == false then
call GroupAddUnit(g,u)
if GetUnitAbilityLevel(c,'B009') > 0 then
call UnitDamageTarget(c,u,150.+80.*GetUnitAbilityLevel(c,'A0KP'),true,true,ATTACK_TYPE_NORMAL,DAMAGE_TYPE_MAGIC,null)
else
call UnitDamageTarget(c,u,75.+40.*GetUnitAbilityLevel(c,'A0KP'),true,true,ATTACK_TYPE_NORMAL,DAMAGE_TYPE_MAGIC,null)
endif
set n = n+1
call SaveInteger(udg_AssassinHash,id,25,n)
call SaveInteger(udg_AssassinHash,id,StringHash("IWI"+I2S(n)),15)
if SQ(X3,Y3,GetUnitX(u),GetUnitY(u)) > SQ(X2,Y2,GetUnitX(u),GetUnitY(u)) then
call SaveReal(udg_AssassinHash,id,StringHash("IWR"+I2S(n)),LoadReal(udg_AssassinHash,id,20))
else
call SaveReal(udg_AssassinHash,id,StringHash("IWR"+I2S(n)),LoadReal(udg_AssassinHash,id,21))
endif
call SaveUnitHandle(udg_AssassinHash,id,StringHash("IWU"+I2S(n)),u)
call DestroyEffect(AddSpecialEffectTarget("Abilities\\Spells\\Other\\FrostArrows\\NagaColdArrowMissile.mdl",u,"chest"))
call DestroyEffect(AddSpecialEffectTarget("Abilities\\Weapons\\SpiritOfVengeanceMissile\\SpiritOfVengeanceMissile.mdl",u,"chest"))
endif
call GroupRemoveUnit(udg_G,u)
exitwhen u == null
endloop
set i = 1
if n > 0 then
loop
exitwhen i > n
set h = LoadInteger(udg_AssassinHash,id,StringHash("IWI"+I2S(i)))-1
set r = LoadReal(udg_AssassinHash,id,StringHash("IWR"+I2S(i)))
set u = LoadUnitHandle(udg_AssassinHash,id,StringHash("IWU"+I2S(i)))
call SaveInteger(udg_AssassinHash,id,StringHash("IWI"+I2S(i)),h)
call SetUnitPathing(u,false)
call SetUnitX(u,SafeX(GetUnitX(u)+15.*Cos(r)))
call SetUnitY(u,SafeY(GetUnitY(u)+15.*Sin(r)))
call IssueImmediateOrder(u,"stop")
if ModuloInteger(h,3) == 0 then
call DestroyEffect(AddSpecialEffectTarget("FrozenOrbBall.mdx",u,"chest"))
call DestroyEffect(AddSpecialEffectTarget("Abilities\\Weapons\\SpiritOfVengeanceMissile\\SpiritOfVengeanceMissile.mdl",u,"chest"))
endif
set i = i + 1
endloop
set i = 1
loop
exitwhen i > n
set h = LoadInteger(udg_AssassinHash,id,StringHash("IWI"+I2S(i)))
set u = LoadUnitHandle(udg_AssassinHash,id,StringHash("IWU"+I2S(i)))
if h <= 0 or IsUnitDeadBX(u) or not IsTarget(u,c) then
set j = i
call GroupRemoveUnit(g,u)
call SetUnitPathing(u,true)
loop
exitwhen j > n
call SaveReal(udg_AssassinHash,id,StringHash("IWR"+I2S(j)),LoadReal(udg_AssassinHash,id,StringHash("IWR"+I2S(j+1))))
call SaveInteger(udg_AssassinHash,id,StringHash("IWI"+I2S(j)),LoadInteger(udg_AssassinHash,id,StringHash("IWI"+I2S(j+1))))
call SaveUnitHandle(udg_AssassinHash,id,StringHash("IWU"+I2S(j)),LoadUnitHandle(udg_AssassinHash,id,StringHash("IWU"+I2S(j+1))))
set j = j + 1
endloop
set n = n-1
call SaveInteger(udg_AssassinHash,id,25,n)
endif
set i = i + 1
endloop
endif
else
set i = 1
if n > 0 then
loop
exitwhen i > n
set h = LoadInteger(udg_AssassinHash,id,StringHash("IWI"+I2S(i)))-1
set r = LoadReal(udg_AssassinHash,id,StringHash("IWR"+I2S(i)))
set u = LoadUnitHandle(udg_AssassinHash,id,StringHash("IWU"+I2S(i)))
call SaveInteger(udg_AssassinHash,id,StringHash("IWI"+I2S(i)),h)
call SetUnitPathing(u,false)
call SetUnitX(u,SafeX(GetUnitX(u)+15.*Cos(r)))
call SetUnitY(u,SafeY(GetUnitY(u)+15.*Sin(r)))
call IssueImmediateOrder(u,"stop")
if ModuloInteger(h,3) == 0 then
call DestroyEffect(AddSpecialEffectTarget("FrozenOrbBall.mdx",u,"chest"))
call DestroyEffect(AddSpecialEffectTarget("Abilities\\Weapons\\SpiritOfVengeanceMissile\\SpiritOfVengeanceMissile.mdl",u,"chest"))
endif
set i = i + 1
endloop
set i = 1
loop
exitwhen i > n
set h = LoadInteger(udg_AssassinHash,id,StringHash("IWI"+I2S(i)))
set u = LoadUnitHandle(udg_AssassinHash,id,StringHash("IWU"+I2S(i)))
if h <= 0 or IsUnitDeadBX(u) then
set j = i
call GroupRemoveUnit(g,u)
call SetUnitPathing(u,true)
loop
exitwhen j > n
call SaveReal(udg_AssassinHash,id,StringHash("IWR"+I2S(j)),LoadReal(udg_AssassinHash,id,StringHash("IWR"+I2S(j+1))))
call SaveInteger(udg_AssassinHash,id,StringHash("IWI"+I2S(j)),LoadInteger(udg_AssassinHash,id,StringHash("IWI"+I2S(j+1))))
call SaveUnitHandle(udg_AssassinHash,id,StringHash("IWU"+I2S(j)),LoadUnitHandle(udg_AssassinHash,id,StringHash("IWU"+I2S(j+1))))
set j = j + 1
endloop
set n = n-1
call SaveInteger(udg_AssassinHash,id,25,n)
endif
set i = i + 1
endloop
endif
if k == false then
set j = 1
loop
exitwhen j > 6
set d = LoadUnitHandle(udg_AssassinHash,id,StringHash("IWU1"+I2S(j)))
call DestroyEffect(AddSpecialEffect("FrozenOrbBall.mdx",GetUnitX(d),GetUnitY(d)))
call DestroyEffect(AddSpecialEffect("Abilities\\Weapons\\SpiritOfVengeanceMissile\\SpiritOfVengeanceMissile.mdl",GetUnitX(d),GetUnitY(d)))
call KillUnit(d)
set j = j + 1
endloop
set j = 1
loop
exitwhen j > 6
set d = LoadUnitHandle(udg_AssassinHash,id,StringHash("IWU2"+I2S(j)))
call DestroyEffect(AddSpecialEffect("FrozenOrbBall.mdx",GetUnitX(d),GetUnitY(d)))
call DestroyEffect(AddSpecialEffect("Abilities\\Weapons\\SpiritOfVengeanceMissile\\SpiritOfVengeanceMissile.mdl",GetUnitX(d),GetUnitY(d)))
call KillUnit(d)
set j = j + 1
endloop
set d = LoadUnitHandle(udg_AssassinHash,id,StringHash("IWU"))
call KillUnit(d)
call DestroyEffect(AddSpecialEffect("FrozenOrbBall.mdx",GetUnitX(d),GetUnitY(d)))
call DestroyEffect(AddSpecialEffect("Abilities\\Weapons\\SpiritOfVengeanceMissile\\SpiritOfVengeanceMissile.mdl",GetUnitX(d),GetUnitY(d)))
call SaveBoolean(udg_AssassinHash,id,8,true)
endif
if k and n <= 0 then
call DestroyGroup(g)
call DestroyTimer(t)
call FlushChildHashtable(udg_AssassinHash,id)
endif
endif
endif
endif
set t = null
set c = null
set d = null
set d1 = null
set g = null
set u = null
endfunction
function IceWall takes nothing returns nothing
local unit c = GetSpellAbilityUnit()
local real a = GetUnitX(c)
local real b = GetUnitY(c)
local real x = SafeX(GetSpellTargetX())
local real y = SafeY(GetSpellTargetY())
local real r = Atan2(y-b,x-a)+1.566
local timer t = CreateTimer()
local real dist = SQ(a,b,x,y)*2.
local integer id = GetHandleId(t)
local unit d
set d = CreateUnit(GetOwningPlayer(c),'e00V',x,y,0)
call UnitAddAbility(d,'Arav')
call UnitRemoveAbility(d,'Arav')
call SetUnitFlyHeight(d,150,0)
call SaveUnitHandle(udg_AssassinHash,id,StringHash("IWU"),d)
call DestroyEffect(AddSpecialEffect("FrozenOrbBall.mdx",x,y))
call DestroyEffect(AddSpecialEffect("Abilities\\Weapons\\SpiritOfVengeanceMissile\\SpiritOfVengeanceMissile.mdl",x,y))
call SaveUnitHandle(udg_AssassinHash,id,0,c)
call SaveReal(udg_AssassinHash,id,3,r)
set r = Atan2(y-b,x-a)
call SaveReal(udg_AssassinHash,id,20,r)
call SaveReal(udg_AssassinHash,id,21,Atan2(b-y,a-x))
call SaveReal(udg_AssassinHash,id,StringHash("X2"),a+dist*Cos(r))
call SaveReal(udg_AssassinHash,id,StringHash("Y2"),b+dist*Sin(r))
call SaveReal(udg_AssassinHash,id,StringHash("X3"),a)
call SaveReal(udg_AssassinHash,id,StringHash("Y3"),b)
call SaveGroupHandle(udg_AssassinHash,id,2,CreateGroup())
call SaveReal(udg_AssassinHash,id,StringHash("X"),x)
call SaveReal(udg_AssassinHash,id,StringHash("Y"),y)
call TimerStart(t,.025,true,function IceWallCreate)
set t = null
set c = null
set d = null
endfunction
Событие - постройка завершена
Действие: Если тип юнита (построенное здание) = стена,
то установить переменую-точку = позиция (построенного здания),
удалить (построенное здание)
создать декорацию типа "Стена-декорация" в точке-переменной
удалить точку
Пишу с работы, редактора под рукой нет. Прошу за ошибки и неточности простить))
Лимит операций, обычно это беда настигает заядлых гуишников.
На jass обычно нету таких проблем.
Создайте таймер с периодом .00 сек и запускайте им функции инициализации триггеров.
функция типа InitTrig_Имя триггера - это функция инициализации триггера, она вызывается из функции InitCustomTriggers, но если этих вызовов очень много то функция упирается в лимит операций и поток завершается так и не создав все триггеры.
При убийстве дракона поставить проверку условия, что убивающий юнит принадлежит красному игроку.
А в действиях - 2 варианта.
Вариант 1. Триггерно уменьшить опыт убивающему герою на количество, равное данному за убийство.
Но если уровень повысится - точно не знаю, сработает ли.
Вариант 2. Убрать в РО опыт за убийство и добавлять его убивающему герою триггерно.
Лучше использовать второй.
Порылся в игровых константах (Вкладка "Дополнительно"). Если изменить указанный пункт, можно задать часть получаемого опыта при отрыве уровня героя. Если поставить все числа 100, то всегда будет даваться полный объем опыта. Можно поставить последнее число 50, тогда при большом отрыве уровней, будет даваться только половина опыта. Как-то так. Могу ошибаться
Так ты же выключаешь триггер на 18 секунд вот он и не срабатывает.
Поставь условие, что герыч не имеет абилки-пустышки, если не имеет - дать её и через 18 сек забрать и пустить молнию.
Правда я не уверен насчёт того, отловится ли attacking unit через 18 сек вейта, проверь...
Вообще, если устраивает орбом - то даёшь "сферу молний" с эффектом "цепь молний", у которой 18 сек перезарядка(у цепи не у сферы)
У меня был вопрос с проигрыванием анимаций моделью предмета, но ответили, что нельзя предметам анимации проиграть. Можно так сделать (это то, что имел ввиду Diaboliko, просто немного подробнее расписано):
Берёшь модель с нужным трупом;
Открываешь её в mdlvis или w3me;
Если в mdlvis, то заходишь в редактор анимаций (F3) и оставляешь только анимацию с трупом;
Если в w3me, то Windows->Sequence Manager и опять же удаляешь все анимации кроме трупа;
Переименовываешь на всякий случай анимацию с трупом в Stand;
Импортируешь модель в карту и назначаешь её предмету;
У такой модели останется куча ненужной информации, например, текстуры от живой модели, но может быть сам сможешь это удалить.
Ну, это просто - берёшь и вспоминаешь все необычные карты. Комуниздишь. Профит.
Для инкома можно сделать зависимость от типа ландшафта. Например, чтобы добывали только на мелководье. Или если возле этого здания есть деревья. Или увеличивать инком в зависимости от кол-ва деревьев рядом. Соответственно, ддеревья можно заменить на другие здания, шахты с золотом и вообще на что угодно. Запилить риск и смотреть кол-во войск возле города.
Можно дать расе ферму, на которой игрок будет производить овец/поросят/людишек и забивать их на мясо. Ну или просто быть источником инкома, который бродит где попало.
Можно запилить фракцию варваров, которые будут добывать золото только убивая и ломая здания.
Можно сделать так, чтобы получаемый героем опыт конвертился в золото. И при покупках/постройках тратился.
Это неважно 2 или 8895465, все что вам нужно это отловить урон в 0.0 ед. от лица того кто кастует стрелы или врубил автокаст и атакует, а так же проверить на бафф стрел, если бафф стрел есть и юнит получил 0.00 ед. урона то в него прилетала стрела от автокаста...
Хоспаде. Вынеси свою лучницу в отдельную карту. У тебя же чёрт ногу сломит.
Не знаю, у меня автокаст нормально перезаряжается. Возможно, дело в основе. Попробуй дать не "Ледяные", а "Огненные стрелы".
Вот. Забыл прикрепить.
А может быть, дело в том, что твоя лучница - "Здание". Честное слово, это три самые замороченные способности у близзард: "Огненные", "Отравленные" и "Ледяные" стрелы. На первый взгляд они одинаковые, но стоит присмотреться... Ух!
Создать список "станящих" баффов, при потере баффа из этого списка проверять есть у юнита еще какой либо бафф из списка.
Если нет - снимать паузу, если есть - ничего не трогать.
переходишь на jass? немного посмотри примеры и почитай статьи. набери в поиск таймеры + хэш-таблица и прочее
раскрыть
На триггерах это будет глупо и неудобно. Нужно создать или хотя бы иметь существующий таймер, потом запустить в определенный момент. Но для начала нужно сохранить данные, с которыми будешь взаимодействовать (например, юнит). К примеру дали пассивный скилл, через 5 минут удалил.
есть несколько способов, это запускать таймер. А другим триггером отлавливать с помощью события завершения времени таймера. Или вызывать напрямую функцию.
Проблема решена. Обнаружилась довольно неожиданно - заметил, что во время крита герой не разбивал лицо сам себе, начал искать модификаторы атаки - у героя было 3 пустышки с нулевыми значениями на основе "ракет". При всех пустых значениях вылетает невидимая ракета по самому себе.
Советую проверять бекапы один за другим, и в том, в котором впервые возникает такая проблема, и искать ошибку, она наверняка где-то в изменениях относительно хронологически предыдущей версии.
Да там есть спец. эф в заклинаниях "похитить" называется.
Должна сфера появится, типа душа.
В карте, что я прикреплял сюда она есть, и как-то тоби сделал, что их создавалось не по 20 штук, а только одна.
Ну и не только атака должна отниматься, но у хп реген.
Ну а так-то пример хороший, и понятно что делать, в том случае, если захочу делать больше уровней для способности.
Где стоит условие (убийца) имеет баф, можно поставить уровень убийцы больше или равно 1, если у нас пасива.
Что получается, если мы убиваем первого героя имея способность, получаем способность и уровень становится 1, последующие убийства увеличивают уровень, через условие не даем повышать ненужные уровни, убивают нас, способности теряем.
Так же можно добавить эффекты, через дамми или же что нить ещё, и когда нас убивают наносим урон всем через способность "взрыв", который так же повышается уровнями (душами) как и остальные. Взрыв можно сделать как через дамми, так и дать закрытую способность самому герою и активировать взрыв при смерти.
Не каких фиксаций, гемора и утечек. Болванка прилагается.
Автору совет, или же урок: Смотри как делают другие, и ломай голову как это можно сделать по своему уникально, возможно проще и оптимальнее.
создать.
направить на 128 точек наверх(90)
сделать неперманентным
текст удалится через 3 секунды
текст затухнет до 100% прозрачности через 3 секунды
Вот чёрт. не успел приплюснуть к посту.
о чем нужно заботиться:
ты создаешь объекты, к которым больше никогда не обратишься. например, локацию, или триггер, который один раз отработал и больше не нужен. представь, что это юнит, который стоит за картой. да, он в игре не участвует, но нахера он стоит?
утечка и есть такой юнит. Не страшно, если оно есть. не страшно, если у тебя счетчик хендлов зашкаливает. наличие утечек не мешает уничтожить объект - просто его хендл не вернется в общий стек. Позаботься, что ты уничтожаешь все ненужные объекты, а утечки можешь особо и не считать.
Патиссончик, про центр области не заметил
точка каждый раз создаётся заново и это утечка Патиссончик, есть прога на сайте для записи логов
так же есть дебаг через прелоад на сайте
вот счётчик утечек
Вот как должен выглядеть полностью правильный триггер без утечек, единственная утечка создастся только при первом использовании, это я так понял переменная группы, ее обнулять нельзя, иначе скил будет работать только раз.
quq_CCCP:
Спасибо, понял что надо создавать форс единожды, чтобы утечек не было
Мдаа уж, оказывается все дело в том, что забыл поставить исходные позиции другим игрокам, хорошо хоть проверить догадался, засиделся за редактором
способ 1
вешать структуру на таймер с помощью эксплойта (для тех кто не знает структура это число) а потом этим таймером вызывать нужную функцию спустя 0 секунд
плюсы:
простота
минусы:
требует добавлять иф на каждую новую функцию
второй способ
тоже самое что и 1 только на таймер вешается вдобавок название функции и таймер вызывает её экзекутом
вот моя библиотека по 2 способу и карта с примером
в библиотеке в самом верху есть небольшой док по 3 функциям
самый простой способ, будет падать без ускорения со скоростью 600
в функцию которая меняет высоту юнита передается два числа, первое высота а второе скорость
здесь я сперва поднял грифона на высоту 1000 мгновенно (скорость 0), а затем роняю его на высоту 0 со скоростью 600
Вот обновленная версия на структурах, я её вроде выкладывал...
либо используйте CreateCreepOfType для создания крипов, так будет респаунить тока тех крипов которых вы создали этой функцией...
Dota_2015, с какого перепугу ATTACK_TYPE_MAGIC урон от заклинаний? у заклинаний тип атаки ATTACK_TYPE_NORMAL, а у тебя это магическая атака волшебниц да прочей шушеры из кампании, наносит 75% урона про героям и доп урон по тяжёлой броне, маг. резистами не режится ибо физический урон от атаки.
У всех заклинаний, да блин даже у долбаных мин гоблина - тип атаки ATTACK_TYPE_NORMAL.
Как вариант, сделать так, что бы модель была разбита на множество текстур которые раскиданы по самым дурацким путям. Ни какой картодел не будет вытаскивать такую модель, ни за что.
quq_CCCP, а можно поподробнее? И это защитит карту от инжекта?
Подробно - это сделай за меня?
Суть:
call BJDebugMsg( I2Sx( 100500 ) )
Выдаст разные значения в депротектнутой и нормальной картах, пока это теория но возьмите и проверьте. I2Sx - фольклорная функция ретурн бага, суть преобразует хеш от строки в строку. именно хеш а не инт. т.е адрес в таблице строк на строку. вот RetunrBug ( www.hiveworkshop.com/threads/accessing-memory-from-the-script-it... ) функция в либе Typecast - I2SH
Ну кароче проверил:
function Trig_J_Test_Actions takes nothing returns nothing
local integer i = 486
local string str = null
set str = S2S( I2SH( i ) )
call BJDebugMsg( str )
set str = null
endfunction
//===========================================================================
function InitTrig_J_Test takes nothing returns nothing
set gg_trg_J_Test = CreateTrigger( )
call TriggerRegisterPlayerEventEndCinematic( gg_trg_J_Test, Player(0) )
call TriggerAddAction( gg_trg_J_Test, function Trig_J_Test_Actions )
endfunction
При добавлении, удалении 3 функций сменяется строка по этому адресу, самое главное найти последнюю строку (ну или как я от балды ввел число) хотя я не уверен что прокатит с числом от балды, нужно найти последнюю строку на момент загрузки карты и смотреть её адрес, а после смотреть что будет записано по этому адресу в таблице строк.
Karp, Ой способов защиты 100500, щяс есть мемхак, я уже выкладывал пример как проверить вводились ли в код карты измненения.
Так же есть возможность писать код карты байткодами, которые внезапно низя прочитать или перевести в JASS это внутренние инстркции JASS машины. Но это достаточно сложно. Так же Можно загружать свои ДЛЛ, а это дает полный контроль над картой, можно зашифровать и сжать данные в архиве хер знает какими алгоритмами которые никогда не видел варкравт, а при загрузке срипта вызывать Дллку которая бы и расшифровывала это дело и вызывала функцию чтения архива + проверяла контрольную сумму архива (вроде в мемхаке была эта функция), контрульная сумма не та - выгружаем из ДЛЛ вирус, чтонить на подобии шифровальщиков. И читерам уже не до карты и варкравта в целом...
Это не для гуи новичков, придется долго морщить лоб и писать карту на jass + малость в с++ шарить.
если цель точка то на кого он баф повешает?
на точку?
или он должен прочесть твои мысли чтобы знать кого бафать
Триггерно UnitAddAbility (unit, 'ай-ди баффа') - не работает.
и не должно работать
для бафов нужен дамикаст
например чтобы повесить кровожадность создаёшь дами юнита со скилом кровожадность и приказываешь кастануть его на юнита
потом убираешь дами юнита
Патиссончик, про центр области не заметил
точка каждый раз создаётся заново и это утечка Патиссончик, есть прога на сайте для записи логов
так же есть дебаг через прелоад на сайте
вот счётчик утечек
Если это кому-то ещё интересно - я нашёл простое решение. Условие - юнит не умеет сражаться в ближнем бою и может атаковать исключительно при наличии стрел. Полагаю изначальный вопрос именно это подразумевал.
-Нужно дать юниту способность предметы(герой). Установить в РО юниту: Бой-атака1-допустимые цели-Нет.
-Н настроить все нужные данные во второй атаке. Не забыв указать тип атаки и тип оружия.
-Стрелы сделать на основе предмета огненного шара (и иже с ним).
-Взять какую-нибудь наработку для стака предметов. Чтобы подбирая стрелы они складывались в инве у юнита в одну ячейку.
-Использовать триггер, для того, чтобы стрелы расходовались:
События:
-Unit Атакован.
Условия:
-Unit-Type of Atacking Unit равно <нужный тип войск(лучники)> Через Or можно ввести несколько типов юнитов
Действия:
-Предмет - Set charges remaining in (Item carried by (attacking unit) of type <наши стрелы>) - выбираем arithmetic, выбираем в нём то же - Set charges remain... ставим знак минус и выбираем 1. в спиcке чарджз ремеининга выбрать Item carried by Hero of Type назначить вместо героя тип атакующего юнита и указать тип артефакта. Теперь нужно сделать, чтобы стрелы, после того, как кончатся, однозначно исчезли из инвентаря боевой единицы.
-If/then/else
указать условие integer compasion set charges... (всё точно как в предыдущем действии) меньше 1
то
-Предмет - remove (Item cerried By (Attacking unit) of type <стрелы>)
иначе Do nothing
quq_CCCP:
Спасибо, понял что надо создавать форс единожды, чтобы утечек не было
Мдаа уж, оказывается все дело в том, что забыл поставить исходные позиции другим игрокам, хорошо хоть проверить догадался, засиделся за редактором
ии я очень сложный замутил 4х ступенчатый (не для босов)так как при строительстве его я думал что движок будет пулять спеллы,его придёться переписывать,но я нашел решение если за моба стоит комп то спелы во вкладке нейтрально посивные он будет юзать но не все главное условие чтобы был комп назначен
» WarCraft 3 / Помощь с массивами переменных
» WarCraft 3 / Блокиратор пути
» WarCraft 3 / Интерфейс
» WarCraft 3 / Канал
» WarCraft 3 / Канал
» WarCraft 3 / Затемнение
» WarCraft 3 / Стены
» WarCraft 3 / Не получать опыта за героя
» WarCraft 3 / Опыт
» WarCraft 3 / Предметы
» WarCraft 3 / Unit атакует?
» WarCraft 3 / Авто-каст
» WarCraft 3 / музыка на экране кампании
» WarCraft 3 / Меню паузы
» WarCraft 3 / Что делать с этим багом?
» WarCraft 3 / Утечки
» WarCraft 3 / Утечки группы.
» WarCraft 3 / Столкновения юнитов
» WarCraft 3 / Изменить тип юнита
» WarCraft 3 / Защита карты
» WarCraft 3 / Усиление заклинаний
» WarCraft 3 / Может ли вылетать карта из-за этого триггера?
» WarCraft 3 / Как сделать чтобы предмет ''Стрелял''
» WarCraft 3 / ИИ не использует скилы